package com.huitong.common.mybatis.handler;

import com.huitong.common.core.domain.Result;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.MyBatisSystemException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * Mybatis异常处理器
 *
 * @author fromdrowning
 * @date 2024/3/26 22:32
 */
@Slf4j
@RestControllerAdvice
public class MybatisExceptionHandler {

    /**
     * 主键或UNIQUE索引数据重复异常处理
     *
     * @param e       主键或UNIQUE索引数据重复异常
     * @param request 请求
     * @return 错误提示
     */
    @ExceptionHandler(DuplicateKeyException.class)
    public Result<Void> handleDuplicateKeyException(DuplicateKeyException e, HttpServletRequest request) {
        log.error("请求地址:{} 数据库中已存在记录:{}", request.getRequestURI(), e.getMessage());
        return Result.error("数据库中已存在该记录");
    }

    /**
     * Mybatis系统异常处理
     *
     * @param e       Mybatis系统异常
     * @param request 请求
     * @return 错误提示
     */
    @ExceptionHandler(MyBatisSystemException.class)
    public Result<Void> handleCannotFindDataSourceException(MyBatisSystemException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        String message = e.getMessage();
        if ("CannotFindDataSourceException".contains(message)) {
            log.error("请求路径:{} 未找到数据源", requestURI);
            return Result.error("未找到数据源");
        } else {
            log.error("请求地址:{} Mybatis系统异常", requestURI, e);
            return Result.error(message);
        }
    }
}
